#include <head.h>

/*
库：
    #include <unistd.h>

1.读取文件read
ssize_t read(int fd,void *buf,size_t count);
    功能：
        从文件描述符'fd'对应的中文中读取最多'count'个字节的数据，并存储到'buf'指向的缓冲区中。
    参数：
        @fd：文件描述符
        @buf：存储读取数据的缓冲区指针
        @count：需要读取的最大字节数
    返回值：
        成功 返回读取的字节数(可能小于‘count’)
        失败 返回-1，并设置相应的错误码
        如果在文件末尾，则返回0

2.写入文件write
ssize_t write(int fd,const void *buf ,size_t count);
    功能：
        将'buf'缓冲区中的'count'个字节写入文件描述符'fd'对应的文件中
    参数：
        @fd:文件描述符
        @buf:包含待写入数据的缓冲区指针
        @count:要写入的字节数
    返回值：
        成功 返回读取的字节数(可能小于'count')
        失败 返回-1 并设置相应的错误码
*/
//===============================================================================
/*
fread/fwrite 和 read/write 主要有以下区别：

@级别:

fread 和 fwrite 是标准库函数，提供更高级的文件操作，通常涉及缓冲区管理。
read 和 write 是系统调用，直接与操作系统进行交互，通常用于底层的文件描述符操作。
@函数签名:

fread:
    size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

fwrite:
    size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

read:
    ssize_t read(int fd, void *buf, size_t count);

write:
    ssize_t write(int fd, const void *buf, size_t count);

@缓冲机制:
    fread 和 fwrite 使用缓冲区，提升效率，操作时通常会先将数据缓存到内存中。
    read 和 write 直接操作文件描述符，不使用内置缓冲区，每次调用都直接与文件或设备交互。

@错误处理:
    fread 和 fwrite 返回成功读取或写入的数据单元数量，如果遇到错误会设置 errno。
    read 和 write 返回成功读取或写入的字节数，失败时返回 -1，错误信息通过 errno 提供。

@操作对象:
    fread 和 fwrite 适用于 FILE* 类型的文件流，与 fopen、fclose 等一起使用。
    read 和 write 适用于文件描述符，通常通过 open、close 等系统调用管理。

总的来说，fread 和 fwrite 提供了更高层次的文件操作接口，适用于标准 I/O，而 read 和 write 提供了更底层的控制，用于直接的文件描述符操作。
*/

int main(int argc,const char *argv[])
{
    //以读写模式打开，如果文件不存在则创建
    int fd=open("example.txt",O_RDWR | O_CREAT,0644);//0644表示文件所有者有读写权限，其他用户只能读
    //以读写模式打开文件，如果文件不存在则创建它
    if(fd==-1)
    {
        //打开文件失败，打印错误信息并退出
        perror("ERROR opening file");
        return 1;//返回0 表示程序执行成功，返回1 表示程序执行失败
    }

    //要写入的文件内容
    char write_buf[]="Hello, world!";
    //向文件写入内容，注意写入长度是字符串长度 减一，因为最后的'\0'不需要写入
    ssize_t bytes_written = write(fd,write_buf,sizeof(write_buf)-1);
    if(bytes_written==-1)
    {
        //写入文件失败，打印错误信息并关闭文件
        perror("ERROR writing to file");
        close(fd);
        return 1;
    }

    //将文件指针移动到文件开头，以便读取文件的内容
    lseek(fd,0,SEEK_SET);

    //用于读取存储读取内容的缓冲区
    char read_buf[20];
    //从文件读取内容，注意读取长度是缓冲区的大小减去1，以留出空间给字符串结束符
    ssize_t bytes_read = read(fd,read_buf,sizeof(read_buf)-1);
    if(bytes_read == -1)
    {
        //读取文件失败，打印错误信息并关闭文件
        perror("ERROR reading file");
        close(fd);
        return 1;
    }

    //添加字符串结束符‘\0’到读取内容的末尾
    read_buf[bytes_read]='\0';
    //打印读取到的内容
    printf("%s",read_buf);

    //关闭文件描述符
    close(fd);
    return 0;
}